/* 
 * File:   color.cpp
 * Author: chaterolas
 * 
 * Created on 24 de junio de 2009, 05:49 PM
 */

#include "color.h"
#include "vector3d.h"

/**
 * Crea una instancia de color apartir de los valores en sus canales
 * @param x - red chanel
 * @param y - green chanel
 * @param z - blue chanel
 */
Color::Color(double x, double y, double z) {
    v = new Vector3D(x, y, z);
}

/**
 * Crea una copia del color orig.
 * @param orig (color a copiar)
 */
Color::Color(const Color& orig) {
    v = new Vector3D(orig.v->coor[0], orig.v->coor[1], orig.v->coor[2]);
}

/**
 * Destruye la instancia que lo llama
 */
Color::~Color() {
    delete v;
}

/**
 * Regresa el valor asociado al canal especificado, con la siguiente convencion :
 * 0 - red, 1 - green, 2 - blue
 * @param canal
 * @return valor (del canal especificado)
 */
double Color::getChanel(int canal) {
    return v->coor[canal];
}

/**
 * Asigna un nuevo valor en el canal especificado a este color
 * @param canal ( red, green o blue con 0,1 o 2 respectivamente)
 * @param val
 */
void Color::setChanel(int canal, double val) {
    v->coor[canal] = val;
}

/**
 * Regresa el color resultante de aplicar la operacion Blend a este
 * color con algun otro.
 * @param c (otro color)
 * @return color (resultante de aplicar la oprecacion blend)
 */
void Color::blend(const Color& c) {

    for(int i = 0; i < 3; i++)
        setChanel(i, getChanel(i) * c.v->coor[i]);

}

/**
 * Regresa el color resultante de sumar este color con otro.
 * @param color
 * @return color (ressultante de la suma)
 */
void Color::add(const Color& c) {

    for(int i = 0; i < 3; i++)
       setChanel(i, getChanel(i) + c.v->coor[i]);

}

/**
 * Regresa el resultado de escalar ela intensidad de este color por un factor
 * real entre 0 y 1.
 * @param f (factor para escalar)
 * @return color (resultante del multiplicar por f cada canal)
 */
void Color::scale(double f) {

    for(int i = 0; i < 3; i++)
        setChanel(i, getChanel(i) * f);

}

